Тема: «Взаємодія між потоками»
Мета: Засвоїти поняття «процесів» та «потоків» як основних компонентів сучасних операційних систем. Здобути навики створення, керування та знищення «процесів» та «потоків» в операційній системі Windows.
Завдання:
Відповідно до варіанту (таблиця) модифікувати програму так, щоб замінити об’єкти синхронізації заданого числа потоків
Таблиця – Варіанти завдань
Системнийвиклик
Варіант
5
Critical Section
4
Mutex
3
Semaphores
Вікно програми результату дослідження стандартної програми:
Текст модифікованої програми:
#include "stdafx.h"
#include "EvryThng.h"
#include <time.h>
#include <stdlib.h>
#include <locale.h>
#define DATA_SIZE 256
typedef struct msg_block_tag { /* Message block */
volatile DWORD f_ready, f_stop;
/* ready state flag, stop flag */
volatile DWORD sequence; /* Message block sequence number */
volatile DWORD nCons, nLost;
short number;
time_t timestamp;
CRITICAL_SECTION mguard; /* Guard the message block structure */
HANDLE hMutex;
DWORD checksum; /* Message contents checksum */
DWORD data[DATA_SIZE]; /* Message Contents */
} MSG_BLOCK;
/* One of the following conditions holds for the message block */
/* 1) !f_ready || f_stop */
/* nothing is assured about the data OR */
/* 2) f_ready && data is valid */
/* && checksum and timestamp are valid */
/* Also, at all times, 0 <= nLost + nCons <= sequence */
/* Single message block, ready to fill with a new message */
MSG_BLOCK mblock = { 0, 0, 0, 0, 0, 0 };
unsigned int WINAPI produce (void *);
unsigned int WINAPI consume (void *);
unsigned int WINAPI _NULL_ (void *);
unsigned int WINAPI _new_ (void *);
void MessageFill (MSG_BLOCK *);
void MessageDisplay (MSG_BLOCK *);
DWORD _tmain (DWORD argc, LPTSTR argv[])
{
unsigned int Status, ThId;
HANDLE produce_h, consume_h, _null_h,_new_h;
/* Initialize the message block CRITICAL SECTION */
InitializeCriticalSection (&mblock.mguard);
mblock.number=1;
printf("==============[ SYNCHRONIZATION CRITICAL SECTION]===============\n");
/* Create the two threads */
produce_h = (HANDLE)_beginthreadex (NULL, 0, produce, NULL, 0, &ThId);
if (produce_h == NULL)
printf("Cannot create producer thread");
consume_h = (HANDLE)_beginthreadex (NULL, 0, consume, NULL, 0, &ThId);
if (consume_h == NULL)
printf("Cannot create consumer thread");
_null_h = (HANDLE)_beginthreadex (NULL, 0, _NULL_, NULL, 0, &ThId);
if (_null_h == NULL)
printf("Cannot create _NULL_ thread");
_new_h = (HANDLE)_beginthreadex (NULL, 0, _new_, NULL, 0, &ThId);
if (_new_h == NULL)
printf("Cannot create _new_ thread");
/* Wait for the producer and consumer to complete */
Status = WaitForSingleObject (consume_h, INFINITE);
if (Status != WAIT_OBJECT_0)
printf("Failed waiting for consumer thread");
Status = WaitForSingleObject (produce_h, INFINITE);
if (Status != WAIT_OBJECT_0)
printf("Failed waiting for producer thread");
Status = WaitForSingleObject (_null_h, INFINITE);
if (Status != WAIT_OBJECT_0)
printf("Failed waiting for null thread");
Status = WaitForSingleObject (_new_h, INFINITE);
if (Status != WAIT_OBJECT_0)
printf("Failed waiting for _new_ thread");
DeleteCriticalSection (&mblock.mguard);
_tprintf (_T("Producer, consumer, null and new threads have terminated\n"));
_tprintf (_T("Messages produced: %d, Consumed: %d, Known Lost: %d\n"),
mblock.sequence, mblock.nCons, mblock.nLost);
Sleep(1000);
printf("==============[ SYNCRNIZATION MUTEX ]===============\n");
mblock.nCons =0;
mblock.f_ready =0;
mblock.nLost =0;
mblock.sequence =0;
mblock.f_stop = 0;
mblock.number=2;
mblock.hMutex = CreateMutex( NULL, FALSE, NULL );
produce_h = NULL;
consume_h = NULL;
produce_h = (HANDLE)_beginthreadex (NULL, 0, produce, NULL, 0, &ThId);
if (produce_h == NULL)
printf("Cannot create producer thread");
consume_h =(HANDLE)_beginthreadex (NULL, 0, consume, NULL, 0, &ThId);
if (consume_h == NULL)
printf(...